package edu.pe.cayetano.model.bo;

import java.util.ArrayList;

import org.apache.commons.beanutils.DynaBean;

import ws.synopsis.frmwrk.common.BResult;
import edu.pe.cayetano.dao.CitaDAO;
import edu.pe.cayetano.dao.OperacionesComunesDAO;
import edu.pe.cayetano.framework.BusinessException;
import edu.pe.cayetano.model.to.SemanaTO;
import edu.pe.cayetano.seccd.constantes.ConstantesSECCD;
import edu.pe.cayetano.util.UtilTime;
import edu.pe.cayetano.util.Utilitario;
import edu.pe.cayetano.util.UtilitarioSQLQuery;

public class CitaBO extends BaseBO{

	
	public StringBuffer estableceQuery(DynaBean dyna){
		StringBuffer 			query 			= new StringBuffer();
		String criterio		= null;
		if(Utilitario.validaAtributoDynaBean(dyna, "criterio"))
			criterio=(String)dyna.get("criterio");
		String campo		= (String)dyna.get("optCampo");
		String operacion	= (String)dyna.get("operacion");
		
		if(operacion.equalsIgnoreCase(ConstantesSECCD.OPERACION_BUSQUEDA)){
			if(campo.equalsIgnoreCase("todos")){
				query = UtilitarioSQLQuery.devuelveListadoCitas();
			}else{
				query = UtilitarioSQLQuery.devuelveListadoCitas();
				query.append(" where upper("+campo.toUpperCase()+") like '%"+criterio.toUpperCase()+"%'"); 
			}

		}
		if(operacion.equalsIgnoreCase(ConstantesSECCD.OPERACION_LISTADO)){
			query = UtilitarioSQLQuery.devuelveListadoCitas();
		}
		System.out.println("CitaBO:estableceQuery:1:"+query.toString());
		return query;
	}

	public StringBuffer estableceQuery(String operacion,String campo,String criterio){
		StringBuffer 			query 			= new StringBuffer();
		if(operacion.equalsIgnoreCase(ConstantesSECCD.OPERACION_BUSQUEDA)){
			if(campo.equalsIgnoreCase("todos")){
				query = UtilitarioSQLQuery.devuelveListadoCitas();
			}else{
				query = UtilitarioSQLQuery.devuelveListadoCitas();
				query.append(" where upper("+campo.toUpperCase()+") like '%"+criterio.toUpperCase()+"%'"); 
			}

		}
		if(operacion.equalsIgnoreCase(ConstantesSECCD.OPERACION_LISTADO)){
			query = UtilitarioSQLQuery.devuelveListadoCitas();
		}
		System.out.println("CitaBO:estableceQuery2:"+query.toString());
		return query;
	}
	
	public BResult listarCita() throws BusinessException{
		BResult 				retSalida		= null;
		StringBuffer 			query 			= new StringBuffer(); 
		OperacionesComunesDAO	operacionesDAO	= null;
		try{
			query = estableceQuery(ConstantesSECCD.OPERACION_LISTADO,"","");
			conectar();
			operacionesDAO	 	= new OperacionesComunesDAO(conn);
			retSalida 	= operacionesDAO.listado(query);
		}catch(Exception e){
			retSalida = new BResult();
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[CitaBO] error en metodo listarCita generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[CitaBO] error en metodo listarCita generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}

	public BResult buscarCita(DynaBean dyna) throws BusinessException{
		BResult 				retSalida		= null;
		OperacionesComunesDAO	operacionesDAO	= null;
		StringBuffer 			query 			= new StringBuffer(); 
		try{
			query = estableceQuery(dyna);
			conectar();
			operacionesDAO	 	= new OperacionesComunesDAO(conn);
			retSalida 			= operacionesDAO.listado(query);
		}catch(Exception e){
			retSalida = new BResult();
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[CitaBO] error en metodo buscarCita generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[CitaBO] error en metodo buscarCita generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}
	
	public BResult getCitasxDia(ArrayList listaFecha,DynaBean dyna) throws BusinessException{
		BResult 				retSalida				= new BResult();
		try{
			conectar();
			CitaDAO 		citaDAO	 	= new CitaDAO(conn);
			ArrayList		listaSalida		= new ArrayList();
			for(int i=0;i<listaFecha.size();i++){
				listaSalida.add(citaDAO.getCitasxDia(((SemanaTO)listaFecha.get(i)).getNombre(),dyna));
			}
			retSalida.setObject(listaSalida);
		}catch(Exception e){
			try {
				deshacer();
			} catch (Exception e2) {
				throw new BusinessException(e.getMessage(), e2);
			}
			retSalida = new BResult();
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[CitaBO] error en metodo getCitasxDia generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[CitaBO] error en metodo getCitasxDia generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}
	
	public BResult getCitasxSemana(ArrayList listaFecha,DynaBean dyna) throws BusinessException{
		BResult 				retSalida				= new BResult();
		try{
			conectar(); 
			CitaDAO 		citaDAO	 	= new CitaDAO(conn);
			ArrayList		listaSalida		= new ArrayList();
			for(int i=0;i<listaFecha.size();i++){
				listaSalida.add(citaDAO.getCitasxDia(((SemanaTO)listaFecha.get(i)).getNombre(),dyna));
			}
			retSalida.setObject(listaSalida);
		}catch(Exception e){
			try {
				deshacer();
			} catch (Exception e2) {
				throw new BusinessException(e.getMessage(), e2);
			}
			retSalida = new BResult();
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[CitaBO] error en metodo getCitasxSemana generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[CitaBO] error en metodo getCitasxSemana generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}
	
	/**
	 * Metodo para insertar citas de atencion
	 * */
	public BResult insertaCita(DynaBean dyna) throws BusinessException{
		BResult 				retSalida				= null;
		try{
			conectar();
			CitaDAO 	citaDAO	 	= new CitaDAO(conn);
			String codigo 	= generaCodigoInsercionCita(citaDAO.obtieneCantidadRegistrosxYear());
			retSalida 	= citaDAO.insertaCita(dyna,codigo);
			grabar();
		}catch(Exception e){
			try {
				deshacer();
			} catch (Exception e2) {
				throw new BusinessException(e.getMessage(), e2);
			}
			retSalida = new BResult();
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[CitaBO] error en metodo insertaCita generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[CitaBO] error en metodo insertaCita generado por:"+e.getMessage());
			}
		}
		return retSalida;
	}
	
	public BResult verPopUpCita(String cita) throws BusinessException{
		BResult 				retSalida		= null;
		try{
			conectar();
			CitaDAO 	citaDAO	 	= new CitaDAO(conn);
			retSalida 			= citaDAO.verPopUpCita(cita);
		}catch(Exception e){
			retSalida = new BResult();
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[CitaBO] error en metodo verPopUpCita generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[CitaBO] error en metodo buscarCita generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}
	
	/**
	 * Metodo que genera el codigo para la tabla cita
	 * */
	public String generaCodigoInsercionCita(int cantidad){
		String codigo="";
		try {
			String temporal = String.valueOf(cantidad+1);
			if(temporal.length()==1)
				codigo="0000"+temporal;
			if(temporal.length()==2)
				codigo="000"+temporal;
			if(temporal.length()==3)
				codigo="00"+temporal;
			if(temporal.length()==4)
				codigo="0"+temporal;
			codigo="CSC"+ UtilTime.devuelveAnioActualDosDigitosFinales().toString()+codigo;
		} catch (Exception e) {
			System.out.println("[CitaBO] error en metodo generaCodigoInsercionCita generado por:"+e.getMessage());
			codigo = null;
		}
		return codigo;
	}
}	
